package com.daisuxia.back.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

/**
 * 向FTP服务器上传文件
 *
 */
public class ImgUploadUtil {
	private static Logger log = Logger.getLogger(ImgUploadUtil.class);

	/**
	 * @param path
	 *            FTP服务器保存目录
	 * @param filename
	 *            上传到FTP服务器上的文件名
	 * @param input
	 *            输入流
	 * @param isImg
	 *            是否上传的为图片(true上传的为图片，false上传的为文件)
	 * @return 路径成功返回文件路径,否则返回""
	 */
	public static String uploadFile(String path, String filename,
			InputStream input, boolean isImg) {
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			String url = PropertiesUtil.get("URL");// url FTP服务器hostname
			int port = Integer.parseInt(PropertiesUtil.get("PORT"));// FTP服务器端口
			String username = PropertiesUtil.get("USERNAME");// username FTP登录账号
			String password = PropertiesUtil.get("PASSWORD");// password FTP登录密码
			ftp.connect(url, port);// 连接FTP服务器
			// 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, password);// 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				log.info("未连接到FTP，用户名或密码错误。");
				ftp.disconnect();
				return "";
			}
			// 判断文件夹是否存在,不存在新建
			/*
			 * if(!new File(filename).isDirectory()){ new
			 * File(filename).mkdirs(); }
			 */
			// 生成16位数字名称
			String name = String.valueOf(UUID16maker.getUUID16Id());
			String fileSuffix = filename.substring(filename.lastIndexOf("."));
			String saveFileName = "";
			if (StringUtils.isNotBlank(name)) {
				saveFileName = name + fileSuffix;
			} else {
				saveFileName = filename;
			}
			// 设置上传的文件为二进制文件
			if (isImg) {
				ftp.setFileType(FTP.BINARY_FILE_TYPE);
			}
			ftp.changeWorkingDirectory(path);
			ftp.storeFile(saveFileName, input);

			input.close();
			ftp.logout();
			StringBuffer sb = new StringBuffer();
			sb.append(url);
			sb.append("/");
			sb.append(saveFileName);
			return sb.toString();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(input != null){
				try {
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
					log.info("FTP的端口错误,请正确配置。");
				}
			}
		}
		return "";
	}

	/**
	 * 从FTP服务器下载文件
	 * 
	 * @param url
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param remotePath
	 *            FTP服务器上的相对路径
	 * @param fileName
	 *            要下载的文件名
	 * @param localPath
	 *            下载后保存到本地的路径
	 * @return
	 */
	public static boolean downFile(String url, int port, String username,
			String password, String remotePath, String fileName,
			String localPath) {
		boolean success = false;
		FTPClient ftp = new FTPClient();
		OutputStream is = null;
		try {
			int reply;
			ftp.connect(url, port);
			// 如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, password);// 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return success;
			}
			ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
			FTPFile[] fs = ftp.listFiles();
			for (FTPFile ff : fs) {
				if (ff.getName().equals(fileName)) {
					File localFile = new File(localPath + "/" + ff.getName());
					is = new FileOutputStream(localFile);
					ftp.retrieveFile(ff.getName(), is);
					is.close();
				}
			}

			ftp.logout();
			success = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if( is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return success;
	}
	
	// 测试方法
/*	public static void main(String[] args) {
		try {
			File file = new File("D:/img/wuhanPic.png");
			String fileName = file.getName();
			FileInputStream in = new FileInputStream(file);
			String imgUrl = uploadFile("/data/testImg", fileName, in, true);
			System.out.println(imgUrl);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}*/
	
}
